﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IndignadoFramework.BackBone.InternalServices;
using IndignadoFramework.BackBone.InternalServices.Implementacion;
using IndignadoFramework.BackBone.Model;
using System.Web;
using Argotic.Common;
using Argotic.Syndication;


namespace OrigenDeDatosApp
{
    class OrigenDeDatosApp
    {
        private OrigenDeDatosServices _origenDeDatosServices;
        
        [STAThread]
        static void Main(string[] args)
        {
            OrigenDeDatosApp demonio = new OrigenDeDatosApp();
            demonio.Start();
        }

        public void Start()
        {
            _origenDeDatosServices = new OrigenDeDatosServicesImpl();
            while (true)
            {
                //gborba  obtengo los Origenes de datos
                IEnumerable<OrigenDeDatosModel> listaOrigenesDeDatosModel = _origenDeDatosServices.getOrigenesDeDatos();
                //guardo los origenes de datos en la base
                this.GuardarOrigenesDeDatos(listaOrigenesDeDatosModel);
                System.Threading.Thread.Sleep(5000);
            }
        }

        public void GuardarOrigenesDeDatos(IEnumerable<OrigenDeDatosModel> listaOrigenes)
        {
            foreach (OrigenDeDatosModel origen in listaOrigenes)
            {
                String html = this.parserFeed(origen);
                if (html != "")
                {
                    //guardo el origen de dato
                    origen.OrigenDeDatoData = html;
                    this._origenDeDatosServices.modificarOrigenDeDato(origen);
                }
            }
  
        }

        public string parserFeed(OrigenDeDatosModel origenDeDatosModel)
        {
            RSSFeedContentModel datos = new RSSFeedContentModel();
            string url = origenDeDatosModel.OrigenDeDatoUrl;

            List<FiltroModel> filtros = origenDeDatosModel.getFiltros();

            string titulo = "", descripcion = "", html = "";

            int cantidad = 3;//cantidad por defecto

            foreach (FiltroModel filtro in filtros)
            {
                switch (filtro.FiltroNombre)
                {
                    case "Titulo":
                        titulo = filtro.FiltroValor;
                        break;
                    case "Descripcion":
                        descripcion = filtro.FiltroValor;
                        break;
                    case "Cantidad":
                        cantidad = Convert.ToInt32(filtro.FiltroValor);
                        if (cantidad <= 0)
                            cantidad = 3;
                        break;
                }
            }

            var settings = new SyndicationResourceLoadSettings
            {
                RetrievalLimit = cantidad
            };
            try
            {
                var feed = GenericSyndicationFeed.Create(new Uri(url), settings);

                if (feed.Resource is RssFeed)
                {
                    datos = ReadRssFeed((RssFeed)feed.Resource);
                }

                if (feed.Resource is AtomFeed)
                {
                    datos = ReadAtomFeed((AtomFeed)feed.Resource);
                }

                html = "";
                foreach (RSSArticleModel articulo in datos.Articles)
                {
                    if ((articulo.Title.Contains(titulo.Trim()))
                       || (articulo.Content.Contains(descripcion.Trim())))
                    {
                        html += "<div id=\"item\">";
                        html += "<h2>";
                        html += "<a href=" + articulo.Link + ">" + articulo.Title + "</a>";
                        html += "</h2>";
                        html += "<!---<p>";
                        html += articulo.PublicationDate.ToLongDateString();
                        html += articulo.Author;
                        html += "</p>--->";
                        html += "<div>";
                        html += articulo.Content;
                        html += "</div>";
                        html += "</div>";

                    }
                }
                return html;
            }
            catch (Exception e)
            {
                return e.Message + "\nOrigen de Datos no disponible";
            }
        }



        private RSSFeedContentModel ReadRssFeed(RssFeed feed)
        {
            var rssContentModel = new RSSFeedContentModel
            {
                FeedTitle = feed.Channel.Title,
                Articles = feed.Channel.Items.Select(item => new RSSArticleModel
                {
                    Title = item.Title,
                    Content = item.Description,
                    PublicationDate = item.PublicationDate,
                    Link = item.Link,
                    Author = item.Author
                })
            };

            return rssContentModel;
        }

        private RSSFeedContentModel ReadAtomFeed(AtomFeed feed)
        {
            var rssContentModel = new RSSFeedContentModel
            {
                FeedTitle = feed.Title.Content,
                Articles = feed.Entries.Select(item => new RSSArticleModel
                {
                    Title = item.Title.Content,
                    Content = item.Content.Content,
                    PublicationDate = item.PublishedOn,
                    Link = item.Links.FirstOrDefault().Uri,
                    Author = string.Join(", ", item.Authors.Select(a => a.Name))
                })
            };

            return rssContentModel;
        }
    }
}
